# coding: utf-8
# Game of Bombs - Projeto P1
# (C) 2014, Roberto Matheus, Angelo Costa / UFCG, Programação 1

# Fase 1

import sys, pygame
import random
import time
from pygame.locals import *
from parede import *
from heroi import *
from destruivel import *
from inimigo import *
from bomba import *
from explosao import *
from jogo import *
from fase2 import *

class Fases:
	
	daenerys_image = pygame.image.load('images/daenerys.png')
	robb_image = pygame.image.load('images/robb.png')
	tyrion_image = pygame.image.load('images/tyrion.png')
	robert_image = pygame.image.load('images/robert.png')
	
	done = False
	gameover = False
	
	cenario = [
    "ZZZZZZZZZZZZZZZZZZZZZZZZZ",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "Z W W W W W W W W W W W Z",
    "Z                       Z",
    "ZZZZZZZZZZZZZZZZZZZZZZZZZ",
    ]
	
	def __init__(self, heroi, screen):
		self.screen = screen
		self.heroi = heroi
		self.paredes = []
		self.inimigos = []
		self.destruiveis = []
		self.y_coord = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480]
		self.x_coord = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736]
		self.coord = []
		self.velocidade = 32
		self.tempo = 0
		self.dx_inimigo = 0
		self.dy_inimigo = 0
		self.dx = 0
		self.dy = 0
		self.soltada = False
		self.dx_fogo = 0
		self.dy_fogo = 0
		self.game_over = pygame.image.load('images/gameover.png')
		self.score = 0
		self.fonte = pygame.font.Font('fonte/Minecraftia.ttf', 18)
		
		self.all_sprites = pygame.sprite.Group()
		self.sprites_heroi = pygame.sprite.Group()
		self.sprites_bomba = pygame.sprite.Group()
		self.sprites_destruiveis = pygame.sprite.Group()
		self.sprites_fogo = pygame.sprite.Group()
		self.sprites_inimigos = pygame.sprite.Group()
		self.sprites_paredes = pygame.sprite.Group()
		
		for x in self.x_coord:
			for y in self.y_coord:
				self.coord.append((x, y))
				
		self.coord.remove((32, 32)) # Posições iniciais do jogador pra não ter que se suicidar sem poder
		self.coord.remove((32, 64)) # escapar da bomba
		self.coord.remove((64, 32))
		
		x = y = 0
		
		for fila in self.cenario:
			for coluna in fila:
				if coluna == 'W':
					if (x, y) in self.coord:
						self.coord.remove((x, y))
					parede = Parede(x, y)
					parede.image = pygame.image.load('images/cone.png')
					self.paredes.append(parede)
					self.all_sprites.add(parede)
					self.sprites_paredes.add(parede)
					
				
				if coluna == 'Z':
					if (x, y) in self.coord:
						self.coord.remove((x, y))
					parede = Parede(x, y)
					parede.image = pygame.image.load('images/cone.png')
					self.paredes.append(parede)
					self.all_sprites.add(parede)
					self.sprites_paredes.add(parede)
				
				x += 32
			y += 32
			x = 0
				
		for i in range(100):
			x = random.choice(self.coord)
			self.coord.remove(x)
			destruivel = Destruivel(x[0], x[1])
			destruivel.image = pygame.image.load('images/cone2.png')
			self.destruiveis.append(destruivel)
			self.all_sprites.add(destruivel)
			self.sprites_destruiveis.add(destruivel)
			
		for i in range(2):
			x = random.choice(self.coord)
			self.coord.remove(x)
			inimigo = Inimigo(x[0], x[1])
			inimigo.image = pygame.image.load('images/inimigo1.png')
			self.inimigos.append(inimigo)
			self.all_sprites.add(inimigo)
			self.sprites_inimigos.add(inimigo)
		
		self.desenhando()
			
	def desenhando(self):
		
		if self.heroi == 'Daenerys':
			heroi = Heroi(self.daenerys_image)
		elif self.heroi == 'Robb':
			heroi = Heroi(self.robb_image)
		elif self.heroi == 'Tyrion':
			heroi = Heroi(self.tyrion_image)
		elif self.heroi == 'Robert':
			heroi = Heroi(self.robert_image)
		
		self.all_sprites.add(heroi)
		self.sprites_heroi.add(heroi)
		
		bomba = None
		explosao = None
		
		while not self.done:
			
			relogio = time.localtime()[-4]
			
			self.screen.fill((35, 140, 35))			
				
			for event in pygame.event.get():
				t = event.type
				
				if t == KEYDOWN:
					k = event.key
					
				if t == QUIT:
					sys.exit()
				
				if t == KEYDOWN:
					
					if k == K_F1:
						pygame.mixer.music.pause()
					
					if k == K_F2:
						pygame.mixer.music.unpause()
					
					if k == K_DOWN:
						self.dy = 1
						self.dx = 0
						heroi.rect[1] += self.velocidade
						for parede in self.paredes:
							if parede.rect.contains(heroi.rect):
								heroi.rect[1] -= self.velocidade
						for destruivel in self.destruiveis:
							if destruivel.rect.contains(heroi.rect):
								heroi.rect[1] -= self.velocidade
								
					elif k == K_UP:
						self.dy = -1
						self.dx = 0
						heroi.rect[1] -= self.velocidade
						for parede in self.paredes:
							if parede.rect.contains(heroi.rect):
								heroi.rect[1] += self.velocidade
						for destruivel in self.destruiveis:
							if destruivel.rect.contains(heroi.rect):
								heroi.rect[1] += self.velocidade
								
					if k == K_RIGHT:
						self.dy = 0
						self.dx = 1
						heroi.rect[0] += self.velocidade
						for parede in self.paredes:
							if parede.rect.contains(heroi.rect):
								heroi.rect[0] -= self.velocidade
						for destruivel in self.destruiveis:
							if destruivel.rect.contains(heroi.rect):
								heroi.rect[0] -= self.velocidade
								
					elif k == K_LEFT:
						self.dy = 0
						self.dx = -1
						heroi.rect[0] -= self.velocidade
						for parede in self.paredes:
							if parede.rect.contains(heroi.rect):
								heroi.rect[0] += self.velocidade
						for destruivel in self.destruiveis:
							if destruivel.rect.contains(heroi.rect):
								heroi.rect[0] += self.velocidade
					if k == K_z:
						if not self.soltada:
							bomba = Bomba(heroi.rect[0], heroi.rect[1])
							bomba.image = pygame.image.load('images/bomb.png')
							bomba.solta()
							self.soltada = True
							self.sprites_bomba.add(bomba)
							self.all_sprites.add(bomba)
			
			if bomba and relogio >= bomba.tempo_explosao:
				explosao = Explosao(bomba.x, bomba.y)
				explosao.image = pygame.image.load('images/fire.png')
				self.sprites_fogo.add(explosao)
				self.all_sprites.add(explosao)
				
				for i in range(1,2):
					explosao = Explosao((bomba.x+(i*32)), bomba.y)
					explosao.image = pygame.image.load('images/fire.png')
					self.sprites_fogo.add(explosao)
					self.all_sprites.add(explosao)
					
				for i in range(1,2):	
					explosao = Explosao((bomba.x-(i*32)), bomba.y)
					explosao.image = pygame.image.load('images/fire.png')
					self.sprites_fogo.add(explosao)
					self.all_sprites.add(explosao)
				
				for i in range(1,2):	
					explosao = Explosao(bomba.x, (bomba.y+(i*32)))
					explosao.image = pygame.image.load('images/fire.png')
					self.sprites_fogo.add(explosao)
					self.all_sprites.add(explosao)
					
				for i in range(1,2):	
					explosao = Explosao(bomba.x, (bomba.y-(i*32)))
					explosao.image = pygame.image.load('images/fire.png')
					self.sprites_fogo.add(explosao)
					self.all_sprites.add(explosao)
				
				self.soltada = False
				bomba.kill()
				bomba = None
				
				for parede in self.sprites_paredes:
					block_hit_list = pygame.sprite.spritecollide(parede, self.sprites_fogo, True)
			
			for explosao in self.sprites_fogo:
				for destruivel in self.sprites_destruiveis:
					if explosao.rect.colliderect(destruivel.rect):
						destruivel.kill()
						self.destruiveis.remove(destruivel)
						self.score += 15
				if explosao.rect.colliderect(heroi.rect):
					heroi.kill()
					self.heroi = None
					self.gameover = True
				for inimigo in self.sprites_inimigos:
					if explosao.rect.colliderect(inimigo.rect):
						inimigo.kill()
						self.inimigos.remove(inimigo)
						self.score += 50
			
			if explosao and relogio >= explosao.tempo_some:
				for explosao in self.sprites_fogo:
						explosao.kill()
						explosao = None
								
			if bomba and bomba.rect.contains(heroi.rect):
				if self.dy > 0:
					heroi.rect[1] -= self.velocidade
				elif self.dy < 0:
					heroi.rect[1] += self.velocidade
				if self.dx > 0:
					heroi.rect[0] -= self.velocidade
				elif self.dx < 0:
					heroi.rect[0] += self.velocidade
					
			if len(self.inimigos) == 0:
					fase2 = Fase2(self.heroi, self.screen, self.score)
			
			for inimigo in self.sprites_inimigos:
				if heroi.rect.colliderect(inimigo.rect):
					heroi.kill()
					self.heroi = None
					self.gameover = True
			
			self.sprites_paredes.draw(self.screen)
			self.sprites_destruiveis.draw(self.screen)
			self.sprites_fogo.draw(self.screen)
			self.sprites_bomba.draw(self.screen)			
			self.sprites_heroi.draw(self.screen)
			
			self.botao_score = self.fonte.render(str(self.score), True, (255, 255, 255))
			self.texto_score = self.fonte.render('Score: ', True, (255, 255, 255))
			self.screen.blit(self.texto_score, (340, 550))
			self.screen.blit(self.botao_score, (430, 550))
			
			if self.gameover:
				self.screen.blit(self.game_over, (310, 250))
				
			self.movimento_inimigos()
			
			self.all_sprites.update()
			pygame.display.update()
			
			if self.gameover:
				pygame.time.delay(3000)
				self.done = True

	def movimento_inimigos(self):
		
		self.tempo = time.localtime()[-4]
					
		for inimigo in self.inimigos:
			self.sprites_inimigos.draw(self.screen)
			if self.tempo >= 0 and self.tempo <= 2:
				inimigo.rect[1] += self.velocidade
				self.dy_inimigo = 1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[1] -= self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[1] -= self.velocidade
						
			if self.tempo > 5 and self.tempo <= 8:
				inimigo.rect[0] -= self.velocidade
				self.dx_inimigo = -1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[0] += self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[0] += self.velocidade
						
			if self.tempo > 10 and self.tempo <= 13:
				inimigo.rect[0] += self.velocidade
				self.dx_inimigo = 1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[0] -= self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[0] -= self.velocidade
						
			if self.tempo > 15 and self.tempo <= 18:
				inimigo.rect[1] -= self.velocidade
				self.dy_inimigo = -1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[1] += self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[1] += self.velocidade
						
			if self.tempo > 20 and self.tempo <= 23:
				inimigo.rect[0] -= self.velocidade
				self.dx_inimigo = -1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[0] += self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[0] += self.velocidade
						
			if self.tempo > 25 and self.tempo <= 28:
				inimigo.rect[0] += self.velocidade
				self.dx_inimigo = 1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[0] -= self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[0] -= self.velocidade
						
			if self.tempo > 30 and self.tempo <= 33:
				inimigo.rect[1] += self.velocidade
				self.dy_inimigo = 1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[1] -= self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[1] -= self.velocidade
						
			if self.tempo > 35 and self.tempo <= 38:
				inimigo.rect[1] -= self.velocidade
				self.dy_inimigo = -1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[1] += self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[1] += self.velocidade
						
			if self.tempo > 40 and self.tempo <= 43:
				inimigo.rect[0] += self.velocidade
				self.dx_inimigo = 1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[0] -= self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[0] -= self.velocidade
						
			if self.tempo > 45 and self.tempo <= 48:
				inimigo.rect[1] -= self.velocidade
				self.dy_inimigo = -1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[1] += self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[1] += self.velocidade
						
			if self.tempo > 50 and self.tempo <= 53:
				inimigo.rect[0] -= self.velocidade
				self.dx_inimigo = -1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[0] += self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[0] += self.velocidade
						
			if self.tempo > 55 and self.tempo <= 58:
				inimigo.rect[1] += self.velocidade
				self.dy_inimigo = 1
				for parede in self.paredes:
					if parede.rect.contains(inimigo.rect):
						inimigo.rect[1] -= self.velocidade
				for destruivel in self.destruiveis:
					if destruivel.rect.contains(inimigo.rect):
						inimigo.rect[1] -= self.velocidade
